
# =======================================================================================================

# 资源：RPM 离线安装包下载：http://www.rpmfind.net/linux/RPM/index.html
# 参考：RPM 离线安装包安装：yum install -y http://www.rpmfind.net/linux/centos/8-stream/AppStream/aarch64/os/Packages/gcc-8.4.1-1.el8.aarch64.rpm

# 资源：gcc 依赖包镜像：https://gcc.gnu.org/mirrors.html
# 资源：gcc 安装包： http://mirror.hust.edu.cn/gnu/gcc/

# 参考：gcc4.8.5升级到高版本gcc遇到的坑： https://blog.csdn.net/weixin_40085653/article/details/108646987
# 参考：make报错，gcc: gengtype-lex.c: No such file or directory： https://blog.csdn.net/lidan3959/article/details/8872573
# 参考：make 如何加快速度：https://blog.csdn.net/gonghuihuihui/article/details/79091762
# 参考：https://blog.csdn.net/weixin_41010198/article/details/106780572    【推荐】【推荐】】
# 参考：以下为，gcc源代码安装
# 参考：https://www.jianshu.com/p/fc162672fae2
# 参考：https://blog.csdn.net/wangqing_12345/article/details/52484723
# 参考：https://blog.csdn.net/ivanlxf/article/details/19080681
# 参考: https://www.cnblogs.com/wanpengcoder/p/5218583.html
# 参考：https://blog.51cto.com/ayuepm/1382240
# 参考：https://blog.csdn.net/lucboll/article/details/93464729
# 参考：http://codingdict.com/questions/45948    （\--enable-optimizations在编译python时做什么？）
# 参考：https://blog.csdn.net/yaoyutian/article/details/90761619  （gcc 执行make编译报错，原因调查和解决） 【推荐】【推荐】
# 参考：https://www.cnblogs.com/ims-/p/12038531.html
# 高版本gcc导致报错：-V 命令没有。http://www.bubuko.com/infodetail-2532434.html

# =======================================================================================================

# 测试1：结果 = 成功
# 安装版本如下：
#   gcc : gcc-7.5.0.tar.gz
# 依赖库，如下：
#   gmp-6.1.0.tar.bz2
#   mpfr-3.1.4.tar.bz2
#   mpc-1.0.3.tar.gz
#   isl-0.16.1.tar.bz2

# ================================

# 测试2：结果 = 成功
# 安装版本如下：
#   gcc : gcc-8.2.0.tar.gz  （变化）
# 依赖库，如下：
#   gmp-6.1.0.tar.bz2
#   mpfr-3.1.4.tar.bz2
#   mpc-1.0.3.tar.gz
#   isl-0.18.tar.bz2  （变化）

# ================================

# 测试3：结果 = 成功
# 安装版本如下：
#   gcc : gcc-10.2.0.tar.gz  （变化）
# 依赖库，如下：
#   gmp-6.1.0.tar.bz2
#   mpfr-3.1.4.tar.bz2
#   mpc-1.0.3.tar.gz
#   isl-0.18.tar.bz2  （变化）

# ================================


# =======================================================================================================

# 修改yum为国内镜像 === 看具体情况，有时候国内镜像不一定完整，这个时候还是要切换回国外地址
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak && \
wget -O /etc/yum.repos.d/CentOS-Base.repo -L http://mirrors.aliyun.com/repo/Centos-7.repo

yum clean all && \
yum makecache

# 清理掉无用的repo
yum --enablerepo=base clean metadata

# =======================================================================================================

# gcc 7.5.0 在内和其以下的版本，需要安装的依赖库
yum install -y  gcc gcc-c++ glibc-static&& \
yum install -y  gcc gcc-c++ automake && \
yum install -y  glibc-static libstdc++-static && \
yum install -y  openssl-devel && \
yum install -y  gmp-devel.x86_64 && \
yum install -y  mpfr-devel.x86_64
# 安装完之后，最好是重启一下机器，确保类库都链接生效
shutdown -h now

# gcc 8.2.0在内和其之外以上的版本，需要安装的依赖库
yum -y install centos-release-scl && \
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils && \
echo "" >> /etc/profile && \
echo "# add by tiandong, for c++ build" >> /etc/profile && \
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile && \
source /etc/profile
# 检查gcc版本从4.8.8升级到高版本9.3.1
gcc --version
# 
yum install -y flex-devel.x86_64  # (gcc-4.8.5以上版本需要安装：待测试，可能不需要安装)
yum install -y flex.x86_64   # (gcc-4.8.5以上版本需要安装)

# =======================================================================================================

mkdir -p /opt/code/gcc/
# 或者手动下载后，上传到服务器指定目录 /opt/code/gcc/

# 注意：此命令可以手动下载方式替换
wget -O /opt/code/gcc/gcc-10.2.0.tar.gz  -L https://mirrors.ustc.edu.cn/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.gz

tar -zxvf /opt/code/gcc/gcc-10.2.0.tar.gz -C /opt/code/gcc/
mkdir -p /opt/env/gcc/
cp -rf /opt/code/gcc/gcc-10.2.0/* /opt/env/gcc/
# 自动方式：安装gcc 依赖库
# gcc 安装gcc依赖项软件, 也可以通过下面手动下载方式安装
# cd /opt/env/gcc/
# ./contrib/download_prerequisites
# 注意这里不能用全路径，执行 /opt/env/gcc/contrib/download_prerequisites

# 下载和安装gcc依赖库
cd /opt/env/gcc/
# 注意：此命令可以手动下载方式替换
wget -L ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2
wget -L ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2
wget -L ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz
wget -L ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2

yum install -y bzip2 && \
cd /opt/env/gcc/
tar -jxvf  ./gmp-6.1.0.tar.bz2 && \
tar -jxvf  ./mpfr-3.1.4.tar.bz2 && \
tar -zxvf  ./mpc-1.0.3.tar.gz && \
tar -jxvf  ./isl-0.18.tar.bz2

# 编译安装 gmp 
mkdir -p /usr/local/gmp && \
cd /opt/env/gcc/gmp-6.1.0 && \
mkdir -p build && \
cd build && \
../configure --prefix=/usr/local/gmp
make -j2 && \
# make check && \
make install

# 编译安装 mpfr
mkdir -p /usr/local/mpfr && \
cd /opt/env/gcc/mpfr-3.1.4 && \
mkdir -p build && \
cd build && \
../configure --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp
make -j2 && \
# make check && \
make install

# 编译安装 mpc
mkdir -p /usr/local/mpc && \
cd /opt/env/gcc/mpc-1.0.3 && \
mkdir -p build && \
cd build && \
../configure --prefix=/usr/local/mpc --with-mpfr=/usr/local/mpfr --with-gmp=/usr/local/gmp
make -j2 && \
# make check && \
make install

# 编译安装 isl
mkdir -p /usr/local/isl
cd /opt/env/gcc/isl-0.18 && \
mkdir -p build && \
cd build && \
../configure --prefix=/usr/local/isl --with-mpc==/usr/local/mpc --with-mpfr=/usr/local/mpfr --with-gmp=/usr/local/gmp
make -j2 && \
# make check && \
make install


# 检查gcc的四个依赖项，都手动安装成功，如下：
cd /opt/env/gcc/
./contrib/download_prerequisites
# 检查结果OK，如下输出信息  --------------------------------------------------------begin
# [root@CNT7XCEPHD09 isl-0.18]# cd /opt/env/gcc/
# [root@CNT7XCEPHD09 gcc]# ./contrib/download_prerequisites
# ./contrib/download_prerequisites: line 58: type: wget: not found
# gmp-6.1.0.tar.bz2: OK
# mpfr-3.1.4.tar.bz2: OK
# mpc-1.0.3.tar.gz: OK
# isl-0.18.tar.bz2: OK
# All prerequisites downloaded successfully.
# 检查结果OK，如下输出信息  --------------------------------------------------------end


# =======================================================================================================

# ------------------------- gcc 8.2.0 和以上版本，会遇到奇怪的问题 ------------------------begin
# 问题1. 执行make命令，报错如下
# 执行 root >> make 报错，如下：
# make[3]: Leaving directory `/opt/env/gcc/gcc-build/gcc'
# make[2]: *** [all-stage1-gcc] Error 2
# make[2]: Leaving directory `/opt/env/gcc/gcc-build'
# make[1]: *** [stage1-bubble] Error 2
# make[1]: Leaving directory `/opt/env/gcc/gcc-build'
# make: *** [all] Error 2
#
# 解决办法:如下
# 升级gcc版本
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
source /etc/profile
# 检查gcc版本从4.8.8升级到高版本9.3.1
gcc --version
# gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)



# 问题2：执行make命令，报错如下
# gengtype-lex.c: No such file or directory
# 
# 解决办法：如下：
# https://blog.csdn.net/lidan3959/article/details/8872573
# yum install -y flex-devel.x86_64 (gcc-4.8.5以上版本需要安装：待测试，可能不需要安装)
# yum install -y flex.x86_64   (gcc-4.8.5以上版本需要安装)
# 
# ------------------------- gcc 8.2.0 和以上版本，会遇到奇怪的问题 ------------------------end



# 构建编译 gcc的 makefile
mkdir -p /opt/env/gcc/gcc-build
cd /opt/env/gcc/gcc-build/
# ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
# 或，如下指定安装目录 /usr/local/gcc
mkdir -p /usr/local/gcc
../configure --prefix=/usr/local/gcc --enable-checking=release --enable-languages=c,c++ --disable-multilib
# 或者，当上面configure方法不行时候，用如下命令
# ../configure --prefix=/usr/local/gcc --enable-checking=release --enable-languages=c,c++ --disable-multilib --with-mpc==/usr/local/gcc/mpc --with-mpfr=/usr/local/gcc/mpfr --with-gmp=/usr/local/gcc/gmp

# 构建编译 gcc的二进制文件
make -j2 # -j2 表示用两个线程并发执行make的编译构建命令
# make check # (一般情况，不需要执行检查，直接执行 make install 安装就好)
make install


# 配置gcc的软连接
# 备份之前的gcc-4.8.5版本
mv /usr/bin/gcc /usr/bin/gcc_4.8.5 && \
mv /usr/bin/g++ /usr/bin/g++_4.8.5
# 创建新的 gcc-10.2.0的软连接
ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc
ln -s /usr/local/gcc/bin/g++ /usr/bin/g++
# 编辑/etc/profile文件，注释掉之前构建使用的默认编译器gcc-9.3.1,
# vi /etc/profile
# 注释掉如下内容：# source /opt/rh/devtoolset-9/enable
# 在执行生效profile: source /etc/profile
# 
# 检查gcc安装是否成功，输出版本信息为 10.2.0
gcc --version
g++ --version
which gcc
which g++


# =======================================================================================================

# 配置gcc的环境变量

cat >> /etc/profile << 'EOF'

GCC_HOME=/usr/local/gcc
PATH=$PATH:$GCC_HOME/bin
EOF

# 生效profile设置
source /etc/profile

# =======================================================================================================